#include "CreadorElementosFisicos.h"
#include "../fisica/CintaTransportadoraFisica.h"

CreadorElementosFisicos::CreadorElementosFisicos(list<Elemento*>* listaElementos) {
	this->listaElementos = listaElementos;

}

void CreadorElementosFisicos::obtenerElemento(Mundo* mundo){

	this->mapString.insert(pair<string,int>("balancin",0));
	this->mapString.insert(pair<string,int>("basquet",1));
	this->mapString.insert(pair<string,int>("bowling",2));
	this->mapString.insert(pair<string,int>("correa",3));
	this->mapString.insert(pair<string,int>("engranaje",4));
	this->mapString.insert(pair<string,int>("globo",5));
	this->mapString.insert(pair<string,int>("motor",6));
	this->mapString.insert(pair<string,int>("plataforma",7));
	this->mapString.insert(pair<string,int>("soga",8));
	this->mapString.insert(pair<string,int>("cinta",9));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"carrito",10));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"huevo",11));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"ayunque",12));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"clavo",13));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"arandela",14));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"atijera",15));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"zpolea",16));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"flipper",17));
	this->mapString.insert(pair<string,int>(/*"cintatransportadora"*/"canasto",18));

	list<Elemento*>::iterator itElementos = this->listaElementos->begin();

	while (itElementos != this->listaElementos->end()){

		Elemento* elemento = (*itElementos);

		string tipo = elemento->getTipo();

		map<string,int>::iterator it = this->mapString.find(tipo);
		/*cout<<"ANCHO Y ALTO DE "<<elemento->getTipo()<<" "<<elemento->getAncho()<<" ;"<<elemento->getAlto()<<endl;
		cout<<"IMPRIMO VALORES ANTES DE SIMULACION:"<<elemento->getTipo()<<" "<<elemento->getX()<<" ; "<<elemento->getY()<<" ang:"<< 360 - elemento->getAnguloRotacion()<<endl;
		*/
		int nroTipo = (*it).second;
		float x = elemento->getX() + elemento->getAncho()/2;
		float y = 100 - elemento->getY() - elemento->getAlto()/2;
		float ancho = elemento->getAncho();
		float alto = elemento->getAlto();
		float angulo =(360- elemento->getAnguloRotacion())*3.1415/180;

		EntidadFisica* entidadFisica = NULL;

		cout << "INICIALIZO ELEMENTOS FISICOS" << endl;

		cout << "Elemento: " << elemento->getTipo() <<
				" X: " << elemento->getX() << " Y: " << elemento->getY() <<"angulo : " <<elemento->getAnguloRotacion()<<"nro tipo:" <<nroTipo<< endl;



		switch (nroTipo){
		case 0:

			entidadFisica = new BalancinFisica(mundo->getWorld(), x, y, ancho, alto, angulo,tipo);
			break;

		case 1:
			entidadFisica = new PelotaBasketFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			break;
		case 2:
			entidadFisica = new PelotaBowlingFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			break;
		case 3:
			entidadFisica = new CorreaFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			break;
		case 4:
			entidadFisica = new EngranajeFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			break;
		case 5:
			entidadFisica = new GloboFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			break;
		case 6:
			entidadFisica = new MotorFisica(mundo->getWorld(), x, y, ancho, alto,tipo);
			entidadFisica->setRotaADerecha(elemento->isRotaADerecha());
			break;
		case 7:
			angulo = (360- elemento->getAnguloRotacion())*3.1415/180;
			entidadFisica = new VigaFisica(mundo->getWorld(), x, y,ancho,alto,angulo,tipo);
			break;
		case 8:

			entidadFisica = new SogaFisica(mundo->getWorld(), x, y,ancho,alto,angulo,tipo);
			break;
		case 9:
			entidadFisica = new CintaTransportadoraFisica(mundo->getWorld(), x, y,ancho,alto,tipo);
			break;

		case 10:
			entidadFisica = new CarritoFisica(mundo->getWorld(), x, y,ancho,alto,angulo,tipo);
			break;

		case 11:
			entidadFisica = new HuevoFisica(mundo->getWorld(), x, y,ancho,alto, angulo, tipo);
			break;
		case 12:
			entidadFisica = new YunqueFisica(mundo->getWorld(), x, y,ancho,alto,tipo);
			cout << "CREE EL YUNQUE " << endl;
			break;
		case 13:
			entidadFisica = new ClavoFisica(mundo->getWorld(), x, y,ancho,alto,angulo,tipo);
			break;
		case 14:
			entidadFisica = new ArandelaFisica(mundo->getWorld(), x, y,ancho,alto,tipo);
			break;
		case 15:
			entidadFisica = new TijeraFisica(mundo->getWorld(), x, y,ancho,alto,angulo, tipo);
			break;
		case 16:
			entidadFisica = new PoleaFisica(mundo->getWorld(), x, y,ancho,alto,tipo);
			break;
		case 17:
			entidadFisica = new FlipperFisica(mundo->getWorld(), x, y,ancho,alto,
					tipo,elemento->isRotaADerecha());
			break;
		case 18:
			entidadFisica = new CanastoFisica(mundo->getWorld(), x, y,ancho,alto,
					tipo);
			break;
		}
		elemento->setElementoFisico(entidadFisica);
		++itElementos;
		cout << "Se asigno un elemento fisico sobre el siguiente elemento: " << elemento->getTipo() <<endl;
	}
}


void CreadorElementosFisicos::jointearElementos(Mundo* mundo){
	list<Elemento*>::iterator itElementos = this->listaElementos->begin();
	list<Elemento*> listaPoleas;

	while (itElementos != this->listaElementos->end()){
		cout << "JOINTEO" << endl;
		Elemento* elemento = (*itElementos);
		if (elemento->getTipo().compare("zpolea")!=0){
			elemento->jointearElemento(mundo->getWorld());
		}
		else{
			listaPoleas.push_back(elemento);
		}
		++itElementos;
	}
	list<Elemento*>::iterator itPoleas =  listaPoleas.begin();
	while (itPoleas != listaPoleas.end()){
		Elemento* polea = (*itPoleas);
		polea->jointearElemento(mundo->getWorld());
		++itPoleas;
	}
}



CreadorElementosFisicos::~CreadorElementosFisicos() {
	// TODO Auto-generated destructor stub
}

